package com.mini.mybatis.type;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 类型处理器接口
 * 负责Java类型和JDBC类型之间的转换
 * @param <T> Java类型
 */
public interface TypeHandler<T> {
    
    /**
     * 设置参数到PreparedStatement中
     * @param ps PreparedStatement对象
     * @param i 参数索引（从1开始）
     * @param parameter 参数值
     * @param jdbcType JDBC类型
     * @throws SQLException SQL异常
     */
    void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
    
    /**
     * 从ResultSet中获取结果
     * @param rs ResultSet对象
     * @param columnName 列名
     * @return 转换后的Java对象
     * @throws SQLException SQL异常
     */
    T getResult(ResultSet rs, String columnName) throws SQLException;
    
    /**
     * 从ResultSet中获取结果
     * @param rs ResultSet对象
     * @param columnIndex 列索引（从1开始）
     * @return 转换后的Java对象
     * @throws SQLException SQL异常
     */
    T getResult(ResultSet rs, int columnIndex) throws SQLException;
    
    /**
     * 从CallableStatement中获取结果
     * @param cs CallableStatement对象
     * @param columnIndex 列索引（从1开始）
     * @return 转换后的Java对象
     * @throws SQLException SQL异常
     */
    T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}